package Stream;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 陈Ser
 * @ClassName Stream_practice
 * @description: TODO
 * @Date 2021/9/20 10:28
 * @Version 1.0
 */
public class Stream_practice {
    public static void main(String[] args) {


        /**
         * Stream 流的注意事项：Stream不调用终止方法，中间的操作不会执行
         */


        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

        /**
         * forEach
         */
        System.out.println("forEach---------------");
        numbers.forEach(System.out::print);//类型名::方法
        numbers.forEach(str -> System.out.print(str));//新参->类名.方法
        System.out.println();
        /**
         * map
         */
        //map 方法用于映射每个元素到对应的结果,返回新的Stream
        System.out.println("map----------------");
        numbers.stream().map(i -> 2 * i);//6,4,4,6,14,6,10
        System.out.println();

        /**
         * filter
         */
        //filter 方法用于通过设置的条件过滤出元素,返回新的Stream.
        //true保留，false遗弃,调用count计数以确保过滤器被使用
        System.out.println("filter---------------");
        numbers.stream().filter(inter -> inter > 5 ? true : false).forEach(System.out::print);
        System.out.println();

        /**
         * limit
         */
        System.out.println("limit------------------");
        numbers.stream().limit(3).forEach(System.out::print);//获得前3个元素
        System.out.println();


        /**
         * sorted
         */
        System.out.println("sorted---------");
        //sorted以升序排序
        numbers.stream().sorted().forEach(System.out::print);
        System.out.println();
        //调用Comparator接口中的降序排序
        numbers.stream().sorted(Comparator.reverseOrder()).forEach(System.out::print);
        System.out.println();

        /**
         * parallelStream
         */
        System.out.println("parallelStream-----------");
        //并行处理，提高性能，无序，类似多线程
        numbers.parallelStream().forEach(System.out::print);
        System.out.println();

        /**
         * Collectors
         */
        System.out.println("Collectors--------------");
        List<String> strings = Arrays.asList("abc", "bc", "efg", "abc", "", "jkl");

        List<String> filteredList = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("转化为List: " + filteredList);

        Set<String> filteredSet = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toSet());
        System.out.println("转化为Set" + filteredSet);

        String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("合并字符串: " + mergedString);

        System.out.println();


        /**
         * 统计
         */

        System.out.println("统计---------------------");
//      numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)
        IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
        System.out.println("列表中最大的数 : " + stats.getMax());
        System.out.println("列表中最小的数 : " + stats.getMin());
        System.out.println("所有数之和 : " + stats.getSum());
        System.out.println("平均数 : " + stats.getAverage());
        System.out.println();
        System.out.println();
    }
}
